package com.study.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 快速入门
 */
@SpringBootTest
public class QuickStart1 {

    private SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

    private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

    @Before
    public void init(){

        // 初始化 realm 数据源
        simpleAccountRealm.addAccount("Marry", "123456", "root", "admin");
        simpleAccountRealm.addAccount("Jack", "222222", "user");
        simpleAccountRealm.addAccount("Rose", "111111");

        // 初始化 SecurityManager 环境, 加载数据源
        defaultSecurityManager.setRealm(simpleAccountRealm);
    }

    /**
     * 测试登录
     */
    @Test
    public void testAuthentication(){
        // 构建环境
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        // 当前操作主体
        Subject subject = SecurityUtils.getSubject();

        // 用户输入的账户和密码
        UsernamePasswordToken marry = new UsernamePasswordToken("Marry", "123456");

        // 登录
        subject.login(marry);

        // 验证登录
        boolean authenticated = subject.isAuthenticated();
        System.out.println("是否登录 : " + authenticated);

        // 验证角色
        boolean root = subject.hasRole("root");
        System.out.println("Marry 是否有 Root 角色 : " + root);

        // 当前登录主体, 获取账号
        Object principal = subject.getPrincipal();
        System.out.println("当前登录用户 : " + principal);

        // 再登录一个用户, 覆盖之前的用户, 存在 session 中, 在当前 session 中再次登录
        UsernamePasswordToken rose = new UsernamePasswordToken("Rose", "111111");
        subject.login(rose);
        PrincipalCollection principals = subject.getPrincipals();
        System.out.println("当前登录用户 : " + principals);

        // 检测是否有 root 角色, 没有返回值, 如果没有则抛错
        subject.checkRole("root");
        // 检测是否有 guest 角色, 同上
        subject.checkRole("guest");

        // 退出
        subject.logout();
        System.out.println("是否登录 : " + subject.isAuthenticated());
    }

}
